<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // Promise 是异步编程的一种解决方案，比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现，ES6 将其写进了语言标准，统一了用法，原生提供了Promise对象。

    // 所谓Promise，简单说就是一个容器，里面保存着某个未来才会结束的事件（通常是一个异步操作）的结果。从语法上说，Promise 是一个对象，从它可以获取异步操作的消息。Promise 提供统一的 API，各种异步操作都可以用同样的方法进行处理。

    // Promise的三个状态
    // pending (进行中)
    // fulfilled  / resolved (已成功)
    // rejected (已失败)

    // Promise的内置方法: resolve()  reject()
    // resolve()  把Promise实例(对象) 由pending(进行中)状态 改为  fulfilled (已成功)
    // reject()  把Promise实例(对象) 由pending(进行中)状态 改为  rejected (已失败)

    // resolve()  reject() 除了可以改变状态  还可以传入一个参数 作为Promise实例中存储的数据


    // （1）对象的状态不受外界影响。Promise对象代表一个异步操作，有三种状态：pending（进行中）、fulfilled（已成功）和rejected（已失败）。只有异步操作的结果，可以决定当前是哪一种状态，任何其他操作都无法改变这个状态。(状态是由用户自行决定的 使用者可以通过异步操作的结果来决定如何改变状态)

    // （2）一旦状态改变，就不会再变，任何时候都可以得到这个结果。Promise对象的状态改变，只有两种可能：从pending变为fulfilled和从pending变为rejected。只要这两种情况发生，状态就凝固了，不会再变了，会一直保持这个结果，这时就称为 resolved（已定型）。如果改变已经发生了，你再对Promise对象添加回调函数，也会立即得到这个结果。这与事件（Event）完全不同，事件的特点是，如果你错过了它，再去监听，是得不到结果的。

    // 注意，为了行文方便，本章后面的resolved统一只指fulfilled状态，不包含rejected状态。

    // 一. 如何创建Promise实例(Promise对象)
    // 注意: 通过构造函数 实例化(创建)出来来的对象 => 叫做实例化对象(Promise对象)

    // var p = new Promise(function () {
    //     // Promise中用于接收异步操作的容器  => 回调函数(提前决定好要执行的内容)
    //     // 此函数 在加载时直接执行  
    //     console.log(1111111);
    // });
    // console.log(p);  // {pending}


    // Promise实例 如何改变状态?

    // 同步代码  => 立即改变状态
    /*  var p = new Promise(function (resolve, reject) { // 形参(名字可以自己决定)
         // Promise中用于接收异步操作的容器  => 回调函数(提前决定好要执行的内容)
         // 此函数 在加载时直接执行
         console.log(1111111);
         // resolve(100); // 在加载时直接执行   立即改变状态 => {fulfilled}
         reject(-100)     // 在加载时直接执行   立即改变状态 => {rejected}
     });
     console.log(p);  // {pending} */

    // 异步代码  => 页面加载时 pending =>  等待异步操作有结果之后 改变状态
    /* debugger;
    var p = new Promise(function (resolve, reject) {
        debugger;
        // Promise中用于接收异步操作的容器  => 回调函数(提前决定好要执行的内容)
        // 此函数 在加载时直接执行
        setTimeout(function () {
            debugger;
            var num = Math.random();
            if (num > 0.5) { // 不拖堂
                resolve("说不拖就不拖!!");
            } else { // 拖堂
                reject("该拖还要拖,不拖堂是不可能的");
            }
            console.log(p);
        }, 5000)
    });
    console.log(p);  // {pending} */

    // （2）一旦状态改变，就不会再变，任何时候都可以得到这个结果。
    // 同步代码  => 立即改变状态
    /*   var p = new Promise(function (resolve, reject) { // 形参(名字可以自己决定)
          // Promise中用于接收异步操作的容器  => 回调函数(提前决定好要执行的内容)
          // 此函数 在加载时直接执行
          console.log(1111111);
          resolve(100); // 在加载时直接执行   立即改变状态 => {fulfilled}
          reject(-100)     //
      });
      console.log(p);  // {pending} */


    /* var p = new Promise(function (resolve, reject) {
        // debugger;
        // Promise中用于接收异步操作的容器  => 回调函数(提前决定好要执行的内容)
        // 此函数 在加载时直接执行
        setTimeout(function () {
            // debugger;
            var num = Math.random();
            reject("该拖还要拖,不拖堂是不可能的");
            resolve("说不拖就不拖!!");
            console.log("5s后的Promise实例", p);
        }, 5000)
    });
    console.log(p);  // {pending} */
</script>

</html>